package com.example.mapexport.utils;

import com.amap.api.maps2d.model.LatLng;
import com.amap.api.services.core.LatLonPoint;

import java.util.ArrayList;
import java.util.List;

public class MapUtils {

    private static MapUtils mapUtils;
    public static MapUtils getInstance(){
        if(null == mapUtils){
            mapUtils = new MapUtils();
        }
        return mapUtils;
    }

    public List<LatLng> createRectangle(double lat, double lng) {
        double distance = 20000;
        final double EARTH_RADIUS = 6371000; // 地球半径，单位 米
        double deltaLat = distance / EARTH_RADIUS; // 纬度偏移量
        double deltaLng = distance / (EARTH_RADIUS * Math.cos(Math.toRadians(lat)));

        double maxLat = lat + Math.toDegrees(deltaLat); // 向北的最大纬度
        double minLat = lat - Math.toDegrees(deltaLat); // 向南的最小纬度

        double maxLng = lng + Math.toDegrees(deltaLng); // 向东的最大经度
        double minLng = lng - Math.toDegrees(deltaLng); // 向西的最小经度
        List<LatLng> points = new ArrayList<>();
        points.add(new LatLng(maxLat, minLng)); // 左上角
        points.add(new LatLng(maxLat, maxLng)); // 右上角
        points.add(new LatLng(minLat, maxLng)); // 右下角
        points.add(new LatLng(minLat, minLng));
        return points;
    }

    public List<LatLonPoint> LatLngToPoint(List<LatLng> list) {
        List<LatLonPoint> pointList = new ArrayList<>();
        for (int i = 0;i < list.size();i++){
            pointList.add(new LatLonPoint(list.get(i).latitude, list.get(i).longitude));
        }
        return pointList;
    }

    public List<List<LatLng>> pointsCreate4Cutting(double lat,double lng) { // 区域进行四等分
        List<LatLng> points = createRectangle(lat,lng);

        List<List<LatLng>> array = new ArrayList<>();
        List<LatLng> leftTop = new ArrayList<>();
        leftTop.add(points.get(0));
        leftTop.add(new LatLng(points.get(0).latitude, lng));
        leftTop.add(new LatLng(lat, lng));
        leftTop.add(new LatLng(lat, points.get(0).longitude));

        List<LatLng> rightTop = new ArrayList<>();
        rightTop.add(new LatLng(points.get(1).latitude, lng));
        rightTop.add(points.get(1));
        rightTop.add(new LatLng(lat, points.get(1).longitude));
        rightTop.add(new LatLng(lat, lng));

        List<LatLng> rightBottom = new ArrayList<>();
        rightBottom.add(new LatLng(lat, lng));
        rightBottom.add(new LatLng(lat, points.get(2).longitude));
        rightBottom.add(points.get(2));
        rightBottom.add(new LatLng(points.get(2).latitude,lng));

        List<LatLng> leftBottom = new ArrayList<>();
        leftBottom.add(new LatLng(lat, points.get(3).longitude));
        leftBottom.add(new LatLng(lat, lng));
        leftBottom.add(new LatLng(points.get(3).latitude,lng));
        leftBottom.add(points.get(3));

        array.add(leftTop);
        array.add(rightTop);
        array.add(rightBottom);
        array.add(leftBottom);
        return array;
    }
}
